﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Globalization;
using moviecentro;
using CruzSur.Models;
using System.Data.SqlClient;
using System.Data;
namespace CruzSur.Controllers
{
    public partial class HomeController : Controller
    {
        gestor dbgestor = new gestor("LocalSqlServer");
        MySQLBuilder dbsql = new MySQLBuilder("LocalSqlServer");
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            ViewBag.Message2 = "w!!";
            ViewData["M2"] = "M1!";
             

            return View();
        }
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(string button, string username)
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            ViewBag.Message2 = "w2!!";
            ViewData["M2"] = "M2!";
            if (button == "Register")
            {
                // Register();
            }


            return View();
        }

        public ActionResult About()
        {
            return View();
        }

        public ActionResult Ayuda()
        {
            return View();
        }


        public ActionResult MenuViaje()
        {
            return View();
        }


        public ActionResult PreViaje(string actionbutton, string FechaConsulta)
        {

            List<Listado_Excepciones> Listado = new List<Listado_Excepciones>();


            if (actionbutton == null)
            {
                ViewBag.FechaConsulta = DateTime.Now.ToString("dd/MM/yyyy");
            }
            else
            {
                bool Procesar = true;


                DateTime Test;
                if (DateTime.TryParseExact(FechaConsulta, "dd/MM/yyyy", null, DateTimeStyles.None, out Test) == false)
                {
                    ModelState.AddModelError("buscar", "Error al ingresar la fecha a consultar");
                    Procesar = false;
                }

                ViewBag.FechaConsulta = FechaConsulta;

                if (Procesar)
                {
                    string SQLContarViajes = "select count(*) from VIAJE (nolock) where   CONVERT(CHAR(8), Fecha_Hora , 112 ) =  CONVERT(CHAR(8), @fecha,112)";

                    System.Data.SqlClient.SqlParameter[] param = new System.Data.SqlClient.SqlParameter[1];
                    param[0] = new SqlParameter("@fecha", SqlDbType.DateTime);
                    param[0].Value = Test;

                    int TotalViajes = dbgestor.ListarSql2ScalarInt(SQLContarViajes, param);

                    if (TotalViajes == 0)
                    {
                        ModelState.AddModelError("buscar", "La fecha no tiene viajes planificados");
                        Procesar = false;
                    }


                    if (Procesar)
                    {

                        string SQL = "select e.ID_VIAJE, e.FECHA_HORA, NOTAS, NOMBRE as EXCEPCIONNOMBRE, E.ID_TIPO_Excepcion  from dbo.VIAJE_EXCEPCION E(nolock) ";
                        SQL += " inner join Tipo_Excepcion T(nolock) on T.ID_TIPO_Excepcion = E.ID_TIPO_Excepcion   ";
                        SQL += " inner join Viaje V (nolock) on V.ID_Viaje = e.ID_Viaje ";
                        SQL += " where   CONVERT(CHAR(8), V.Fecha_Hora , 112 ) =  CONVERT(CHAR(8), @fecha,112)";

                        System.Data.SqlClient.SqlParameter[] param2 = new System.Data.SqlClient.SqlParameter[1];
                        param2[0] = new SqlParameter("@fecha", SqlDbType.DateTime);
                        param2[0].Value = Test;

                        SqlDataReader reader = dbgestor.ListarSql2(SQL, param2);



                        if (reader != null)
                        {
                            while (reader.Read())
                            {
                                Listado_Excepciones item = new Listado_Excepciones();
                                item.DescExcepcion = reader["EXCEPCIONNOMBRE"].ToString();
                                item.Notas = reader["NOTAS"].ToString();
                                item.TipoExcepcion = reader["ID_TIPO_Excepcion"].ToString();
                                item.FechaExcepcion = reader.GetDateTime(reader.GetOrdinal("FECHA_HORA")).ToString("dd/MM/yyyy");
                                Listado.Add(item);


                            }
                        }

                        reader.Close();
                        reader.Dispose();

                        if (Listado.Count == 0)
                            ModelState.AddModelError("buscar", "La fecha no tiene excepciones registradas");
                    }



                }
            }
            return View(Listado);
        }

        public ActionResult C10_RecepcionEntregaEncomiendas()
        {
            EncomiendaModel Encomienda = new EncomiendaModel();
            Encomienda.ID = 0;



            return View(Encomienda);

        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult C10_RecepcionEntregaEncomiendas(string actionbutton, string codigoencomienda, string[] chkEnviado, string[] chkRecibido, string popuprowkey)
        {

            // ----- Lista tipo
            List<SelectListItem> ListExcepcionTipoCMB = new List<SelectListItem>();

            SqlDataReader readerTipoObservacion = dbgestor.ListarSql("select * from dbo.TipoObservacion (nolock)");

            while (readerTipoObservacion.Read())
            {
                SelectListItem ListExcepcionTipo = new SelectListItem();
                ListExcepcionTipo.Text = readerTipoObservacion["Descripcion"].ToString();
                ListExcepcionTipo.Value = readerTipoObservacion["ID_TipoObservacion"].ToString();
                ListExcepcionTipoCMB.Add(ListExcepcionTipo);
            }
            readerTipoObservacion.Close();

            ViewBag.CmbExcepciones = ListExcepcionTipoCMB;

            // ----- Empty Encomienda
            EncomiendaModel Encomienda = new EncomiendaModel();
            Encomienda.ID = 0;
            Encomienda.Origen = "MArte";
            Encomienda.Destino = "MArte";
            Encomienda.Codigo = "AAA";

            ViewBag.codigoencomienda = codigoencomienda;


            if (actionbutton == "Actualizar" || actionbutton == "ActualizarRecibido")
            {
                //validar encomienda
                EncomiendaModel tempEncomienda = GetEncomiendaModel(codigoencomienda);
                bool GrabarCheckBox = true;
                if ( actionbutton == "ActualizarRecibido")
                {
                    tempEncomienda.ValidarRecibido = true;

                    if (chkRecibido != null)
                    {
                        foreach (string item in chkRecibido)
                        {
                            tempEncomienda.SetDetalleRecibido(item, true);
                        }
                    }

                    if (tempEncomienda.ValidarDetalleRecibido() == false)
                    {
                        GrabarCheckBox = false; ;
                        ModelState.AddModelError("buscar", "Debe completar los datos de recepcion");
                    }
                    
                }

                if (actionbutton == "Actualizar")
                {
                    tempEncomienda.ValidarEnviado = true;

                    if (chkEnviado != null)
                    {
                        foreach (string item in chkEnviado)
                        {
                            tempEncomienda.SetDetalleEnviado(item, true);
                        }
                    }

                    if (tempEncomienda.ValidarDetalleEnviado() == false)
                    {
                        GrabarCheckBox = false; ;
                        ModelState.AddModelError("buscar", "Debe completar los datos de envio");
                    }
                }

                //chkEnviado;
                if (GrabarCheckBox)
                {
                    bool GrabadoItem = false;
                    if (chkRecibido != null)
                    {
                        foreach (string item in chkRecibido)
                        {
                            dbsql.ClearSQL();
                            dbsql.AddTable("Encomienda");
                            dbsql.AddField(SqlDbType.Bit, "EstadoRecibido", true);
                            dbsql.AddWhere(SqlDbType.VarChar, "id", item);
                            int i = dbsql.UpdateNow();

                            dbsql.ClearSQL();
                            dbsql.AddTable("EncomiendaTransportar");
                            dbsql.AddField(SqlDbType.Bit, "EstadoRecibido", true);
                            dbsql.AddWhere(SqlDbType.VarChar, "id", codigoencomienda);
                            dbsql.UpdateNow();

                            GrabadoItem = true;
                        }
                    }

                    if (chkEnviado != null)
                    {
                        foreach (string item in chkEnviado)
                        {
                            dbsql.ClearSQL();
                            dbsql.AddTable("Encomienda");
                            dbsql.AddField(SqlDbType.Bit, "EstadoEnviado", true);
                            dbsql.AddWhere(SqlDbType.VarChar, "id", item);
                            int i = dbsql.UpdateNow();

                            
                            dbsql.ClearSQL();
                            dbsql.AddTable("EncomiendaTransportar");
                            dbsql.AddField(SqlDbType.Bit, "EstadoEnviado", true);
                            dbsql.AddWhere(SqlDbType.VarChar, "id", codigoencomienda);
                            dbsql.UpdateNow();

                            GrabadoItem = true;
                        }
                    }

                    if (GrabadoItem)
                    {
                        ModelState.AddModelError("buscar", "La lista se ha guardado satisfactoriamente");
                        actionbutton = "Clear";
                    }
                }
            }

            if (popuprowkey != null && popuprowkey != "")
            {
                string Observacion = "";
                string tipoexcepcion = "1";
                if (Request["MsgBoxText" + popuprowkey] != null)
                {
                    Observacion = Request["MsgBoxText" + popuprowkey].ToString();
                    tipoexcepcion = Request["MsgBoxTipo" + popuprowkey].ToString();
                }
                //ModelState.AddModelError("buscar", "grabar obse " + Observacion);
                ModelState.AddModelError("buscar", "Se ha grabado la observación");

                dbsql.ClearSQL();
                dbsql.AddTable("Observaciones");
                dbsql.AddField(SqlDbType.Int, "Tipo", tipoexcepcion);
                dbsql.AddField(SqlDbType.VarChar, "Descripcion", Observacion);
                dbsql.AddField(SqlDbType.Int, "IdEncomienda", popuprowkey);
                dbsql.InsertNow();


            }

            ViewBag.popuprowkey = "";
            ModelState.Remove("popuprowkey");   
            
            
            ///BUSCAR DATA
            if (actionbutton == "Buscar" || actionbutton == "Actualizar" || actionbutton == "ActualizarRecibido" ||
                (popuprowkey != null && popuprowkey != "")
                )
            {
                //  Register();
                Encomienda = GetEncomiendaModel(codigoencomienda);

                

            }



            return View(Encomienda);
        }
        
        EncomiendaModel GetEncomiendaModel(string codigoencomienda)
        {

            EncomiendaModel Encomienda = new EncomiendaModel();
            Encomienda.ID = 0;
            Encomienda.Origen = "MArte";
            Encomienda.Destino = "MArte";
            Encomienda.Codigo = "AAA";

            System.Data.SqlClient.SqlParameter[] param = new System.Data.SqlClient.SqlParameter[1];
            param[0] = new SqlParameter("@id", SqlDbType.VarChar);
            param[0].Value = codigoencomienda;

            SqlDataReader reader = dbgestor.ListarSql2("exec EncomiendaTransportarListar @id", param);
            if (reader.HasRows)
            {
                reader.Read();
                Encomienda.ID = reader.GetInt32(reader.GetOrdinal("ID"));
                Encomienda.Origen = reader.GetString(reader.GetOrdinal("LUGARORIGEN"));
                Encomienda.Destino = reader.GetString(reader.GetOrdinal("LUGARDESTINO"));
 
                Encomienda.EstadoEnviado = reader.GetBoolean(reader.GetOrdinal("EstadoEnviado"));
                Encomienda.EstadoRecibido = reader.GetBoolean(reader.GetOrdinal("EstadoRecibido"));
            }
            else
            {
                ModelState.AddModelError("buscar", "El código de encomienda no existe");
            }
            reader.Close();

            System.Data.SqlClient.SqlParameter[] param2 = new System.Data.SqlClient.SqlParameter[1];
            param2[0] = new SqlParameter("@id", SqlDbType.VarChar);
            param2[0].Value = codigoencomienda;


            reader = dbgestor.ListarSql2("exec EncomiendaListarDetalle @id", param2);
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    EncomiendaDetalleModel Detalle = new EncomiendaDetalleModel();
                    Detalle.ID = reader.GetInt32(reader.GetOrdinal("ID"));
                    Detalle.Remitente = reader.GetString(reader.GetOrdinal("Remitente"));
                    Detalle.Destinatario = reader.GetString(reader.GetOrdinal("Destinatario"));
                    Detalle.EstadoEnviado = reader.GetBoolean(reader.GetOrdinal("EstadoEnviado"));
                    Detalle.EstadoRecibido = reader.GetBoolean(reader.GetOrdinal("EstadoRecibido"));
                    Encomienda.Detalle.Add(Detalle);
                }
            }
            reader.Close();

            //Observaciones
            foreach (EncomiendaDetalleModel item in Encomienda.Detalle)
            {
                System.Data.SqlClient.SqlParameter[] param3 = new System.Data.SqlClient.SqlParameter[1];
                param3[0] = new SqlParameter("@id", SqlDbType.Int);
                param3[0].Value = item.ID;

                reader = dbgestor.ListarSql2("exec EncomiendaListarObservacionm @id", param3);

                while (reader.Read())
                {
                    EncomiendaObservacionModel observacion = new EncomiendaObservacionModel();
                    observacion.ID = reader.GetInt32(reader.GetOrdinal("ID"));
                    observacion.Tipo = reader["Tipo"].ToString();
                    observacion.TipoDesc = reader["TipoObservacion"].ToString();
                    observacion.Descripcion = reader["Descripcion"].ToString();

                    item.Observaciones.Add(observacion);
                }
            }

            return Encomienda;
        }

        public bool ValidateDate(string FechaConsulta)
        {
            DateTime Test;
            if (DateTime.TryParseExact(FechaConsulta, "dd/MM/yyyy", null, DateTimeStyles.None, out Test) == false)
            {
                //ModelState.AddModelError("buscar", "Error al ingresar la fecha a consultar");                
                return false;
            }
            return true;
        }

        public DateTime CreateDate(string FechaConsulta)
        {
            DateTime Test;
            if (DateTime.TryParseExact(FechaConsulta, "dd/MM/yyyy", null, DateTimeStyles.None, out Test) == false)
            {
                //ModelState.AddModelError("buscar", "Error al ingresar la fecha a consultar");                
                return new DateTime(1980,1,1);
            }
            return Test;
        }

        public DateTime CreateDateEnd(string FechaConsulta)
        {
            DateTime Test;
            if (DateTime.TryParseExact(FechaConsulta, "dd/MM/yyyy", null, DateTimeStyles.None, out Test) == false)
            {
                //ModelState.AddModelError("buscar", "Error al ingresar la fecha a consultar");                
                return new DateTime(1980, 1, 1);
            }



            return Test.AddHours(23).AddMinutes(59); 
        }
         
    }

   
}
